/**
 * 事件总线 - EventManager 的便捷封装
 * 
 * 提供更简洁的 API 和预定义的事件类型
 * 
 * @author AI Assistant
 * @date 2025-11-30
 * @version 1.0.0
 */

import { EventManager, EventHandler, EventListenerOptions } from './EventManager';

/**
 * 游戏事件类型定义
 * 
 * 可以根据你的游戏需求扩展
 */
export enum GameEvent {
    // ========== 游戏生命周期 ==========
    /** 游戏启动 */
    GAME_START = 'game:start',
    /** 游戏暂停 */
    GAME_PAUSE = 'game:pause',
    /** 游戏恢复 */
    GAME_RESUME = 'game:resume',
    /** 游戏结束 */
    GAME_OVER = 'game:over',
    /** 游戏重启 */
    GAME_RESTART = 'game:restart',

    // ========== 玩家事件 ==========
    /** 玩家登录 */
    PLAYER_LOGIN = 'player:login',
    /** 玩家登出 */
    PLAYER_LOGOUT = 'player:logout',
    /** 玩家升级 */
    PLAYER_LEVEL_UP = 'player:levelUp',
    /** 玩家死亡 */
    PLAYER_DIED = 'player:died',
    /** 玩家复活 */
    PLAYER_RESPAWN = 'player:respawn',
    /** 玩家受伤 */
    PLAYER_DAMAGED = 'player:damaged',
    /** 玩家治疗 */
    PLAYER_HEALED = 'player:healed',

    // ========== UI 事件 ==========
    /** 打开界面 */
    UI_OPEN = 'ui:open',
    /** 关闭界面 */
    UI_CLOSE = 'ui:close',
    /** 界面显示 */
    UI_SHOW = 'ui:show',
    /** 界面隐藏 */
    UI_HIDE = 'ui:hide',
    /** 按钮点击 */
    UI_BUTTON_CLICK = 'ui:buttonClick',

    // ========== 资源事件 ==========
    /** 资源加载开始 */
    RESOURCE_LOAD_START = 'resource:loadStart',
    /** 资源加载进度 */
    RESOURCE_LOAD_PROGRESS = 'resource:loadProgress',
    /** 资源加载完成 */
    RESOURCE_LOAD_COMPLETE = 'resource:loadComplete',
    /** 资源加载失败 */
    RESOURCE_LOAD_ERROR = 'resource:loadError',

    // ========== 战斗事件 ==========
    /** 战斗开始 */
    BATTLE_START = 'battle:start',
    /** 战斗结束 */
    BATTLE_END = 'battle:end',
    /** 击杀敌人 */
    ENEMY_KILLED = 'battle:enemyKilled',
    /** 技能释放 */
    SKILL_CAST = 'battle:skillCast',

    // ========== 物品事件 ==========
    /** 获得物品 */
    ITEM_ACQUIRED = 'item:acquired',
    /** 使用物品 */
    ITEM_USED = 'item:used',
    /** 装备物品 */
    ITEM_EQUIPPED = 'item:equipped',
    /** 卸下物品 */
    ITEM_UNEQUIPPED = 'item:unequipped',

    // ========== 货币事件 ==========
    /** 金币变化 */
    COIN_CHANGED = 'currency:coinChanged',
    /** 钻石变化 */
    DIAMOND_CHANGED = 'currency:diamondChanged',

    // ========== 网络事件 ==========
    /** 连接成功 */
    NETWORK_CONNECTED = 'network:connected',
    /** 连接断开 */
    NETWORK_DISCONNECTED = 'network:disconnected',
    /** 网络错误 */
    NETWORK_ERROR = 'network:error',

    // ========== 音频事件 ==========
    /** 音乐播放 */
    MUSIC_PLAY = 'audio:musicPlay',
    /** 音乐停止 */
    MUSIC_STOP = 'audio:musicStop',
    /** 音效播放 */
    SOUND_PLAY = 'audio:soundPlay',
}

/**
 * 事件总线类
 * 
 * 使用示例：
 * ```typescript
 * // 订阅事件
 * EventBus.on(GameEvent.PLAYER_LEVEL_UP, (data) => {
 *     console.log('玩家升级到', data.level);
 * });
 * 
 * // 发布事件
 * EventBus.emit(GameEvent.PLAYER_LEVEL_UP, { level: 10 });
 * ```
 */
export class EventBus {
    /** 内部事件管理器 */
    private static eventManager: EventManager = EventManager.getInstance();

    /**
     * 订阅事件
     */
    public static on<T = any>(
        type: string | GameEvent,
        handler: EventHandler<T>,
        options?: EventListenerOptions
    ): () => void {
        return this.eventManager.on(type, handler, options);
    }

    /**
     * 订阅一次性事件
     */
    public static once<T = any>(
        type: string | GameEvent,
        handler: EventHandler<T>,
        options?: EventListenerOptions
    ): () => void {
        return this.eventManager.once(type, handler, options);
    }

    /**
     * 取消订阅
     */
    public static off<T = any>(type: string | GameEvent, handler?: EventHandler<T>): void {
        this.eventManager.off(type, handler);
    }

    /**
     * 根据目标取消订阅
     */
    public static offByTarget(target: any): void {
        this.eventManager.offByTarget(target);
    }

    /**
     * 发布事件
     */
    public static emit<T = any>(type: string | GameEvent, data?: T): boolean {
        return this.eventManager.emit(type, data);
    }

    /**
     * 发布异步事件
     */
    public static async emitAsync<T = any>(type: string | GameEvent, data?: T): Promise<boolean> {
        return this.eventManager.emitAsync(type, data);
    }

    /**
     * 检查是否有监听器
     */
    public static hasListener(type: string | GameEvent): boolean {
        return this.eventManager.hasListener(type);
    }

    /**
     * 获取监听器数量
     */
    public static getListenerCount(type: string | GameEvent): number {
        return this.eventManager.getListenerCount(type);
    }

    /**
     * 清空所有监听器
     */
    public static clear(): void {
        this.eventManager.clear();
    }

    /**
     * 启用调试模式
     */
    public static setDebugMode(enabled: boolean): void {
        this.eventManager.setDebugMode(enabled);
    }

    /**
     * 启用统计
     */
    public static setStatsEnabled(enabled: boolean): void {
        this.eventManager.setStatsEnabled(enabled);
    }

    /**
     * 获取统计信息
     */
    public static getStats(type?: string | GameEvent) {
        return this.eventManager.getStats(type);
    }

    /**
     * 打印统计信息
     */
    public static printStats(): void {
        this.eventManager.printStats();
    }

    /**
     * 打印所有监听器
     */
    public static printListeners(): void {
        this.eventManager.printListeners();
    }
}

/**
 * 默认导出
 */
export default EventBus;

